package com.yunyi.camunda.listener;

import com.yunyi.camunda.mapper.INodeUserMapper;
import com.yunyi.camunda.pojo.dto.NodeUser;
import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.camunda.bpm.engine.delegate.TaskListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 监听
 *
 * @author yunyi
 */
@Slf4j
@Component
public class FlowTaskListener implements TaskListener {

    @Autowired
    private INodeUserMapper iNodeUserMapper;

    /**
     * 1、在create事件之前不会触发其他与任务相关的事件
     * 2、当分配人、所有者等属性发生变更时会触发update事件，任务的初始化是不会触发update事件的。
     * 3、在流程定义中显式定义了具有受让人的任务被创建时，assignment事件会在create事件之后触发。
     * 更改任务assignee属性，assignment事件会在update事件之后触发。
     * 4、当任务成功完成时，触发complete事件。
     * 5、delete事件发生在任务从运行时数据中删除之前。
     * 6、complete事件和delete事件是互斥的。
     */
    @Override
    public void notify(DelegateTask delegateTask) {
        log.info("任务监听器监听类型:" + delegateTask.getEventName());
        log.info("任务监听器监听到的实例id:" + delegateTask.getExecution().getProcessInstanceId());
        DelegateExecution execution = delegateTask.getExecution();
        //nodeId
        String currentActivityId = execution.getCurrentActivityId();
        //DefinitionId
        String processDefinitionId = execution.getProcessDefinitionId();
        String processDefinitionKey = processDefinitionId.split(":")[0];
        String taskId = delegateTask.getId();
        NodeUser nodeUser = iNodeUserMapper.queryUserByProcessAndNode(processDefinitionKey, currentActivityId);
        if (nodeUser != null) {
            log.info("通过节点监听改变:" + taskId + "指定人");
            delegateTask.setAssignee(String.valueOf(nodeUser.getUserId()));
        }


    }
}